from utils.electrode_ctrl import ElectrodeCtrl
import numpy as np
from time import sleep,time,perf_counter

# 22/July/2024: two boards line scan looks working, take care of the timing of pattern

def sleep_us(us:float):
    sleep(us / 1_000_000)

# Function to busy-wait for a specified number of microseconds
def busy_wait_us(us: float):
    end_time = perf_counter() + us / 1_000_000  # Calculate end time in seconds
    while perf_counter() < end_time:
        pass  # Busy-wait loop

if __name__=='__main__':
    frame_open = np.zeros((8,8))
    elec = []

    elec.append(ElectrodeCtrl('COM14', 115200, 'com')) # 2号板子（靠近风扇）
    elec.append(ElectrodeCtrl('COM15', 115200, 'com'))  # 1号板子（远离风扇）
    #elec.append(ElectrodeCtrl('COM13', 115200, 'com'))  # 1号板子（远离风扇）




    pattern = np.zeros((8,8))

    while True:
        for line in range(8):
            print(f'----------正在扫描第{line+1}行--------------')
            print('持续扫描1s')
            count = 0

            start_time = perf_counter()  # Record the start time using perf_counter
            #start_time = time()  # 记录开始扫描该行的时间
            while perf_counter() - start_time < 2:  # 持续1秒钟
                # 单点，从左扫到右
                for i in range(8):
                    pattern[line, i] = 1
                    #print(pattern)
                    for index, board in enumerate(elec):
                        # 取消板子高阻态
                        board.on()
                        #print(f' 第{index + 1}个板子,第{i + 1}个电极点')
                        # print(pattern)
                        board.set_tick(pattern=pattern,
                                       pp=1000,
                                       pw=200,
                                       pn=1,
                                       bp=1000 ,
                                       pulse_type='neg'
                                       )

                        tick_start_time = perf_counter()
                        #print(tick_start_time)
                        busy_wait_us(1000)  # Busy-wait for 10 microsecond
                        #sleep_us(1000)
                        tick_end_time = perf_counter()
                        #print(tick_end_time)
                        #pattern[line, i] = 0
                        board.off()

                        # Adjust sleep time based on time taken for other operations
                        tick_duration = tick_end_time - tick_start_time
                        #print(f"Board {index + 1}, Line {line + 1}, Electrode {i + 1}, Tick duration: {tick_duration}")
                    pattern[line, i] = 0

                        #print(f"Tick duration: {tick_duration}")

                count += 1
            print(f'第{line + 1}行扫描完毕')
            print(f'第{line + 1}行扫描次数：{count}')

                # # 对于每块板子
                # for index, board in enumerate(elec):
                #
                #     # 取消板子高阻态
                #     board.on()
                #
                #     # 单点，从左扫到右
                #     for i in range(8):
                #         pattern[line, i] = 1
                #         print(f' 第{index + 1}个板子{line + 1}行,第{i + 1}个电极点')
                #         # print(pattern)
                #         board.set_tick(pattern=pattern,
                #                        pp=100,
                #                        pw=50,
                #                        pn=1,
                #                        bp=100,
                #                        pulse_type='neg'
                #                        )
                #
                #         sleep_us(100)
                #         pattern[line, i] = 0


